/*
DateChooser 2.11
June 29, 2010
For usage details see http://yellow5.us/projects/datechooser/

Creative Commons Attribution 2.0 License
http://creativecommons.org/licenses/by/2.0/
*/

if (!window.objPHPDate)
{
	window.objPHPDate =
	{
		/* These values are defaults. Please feel free to modify them as needed. */

		aDay: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
		aShortDay: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
		aLetterDay: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
		aMonth: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
		aShortMonth: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
		aSuffix: ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'st'],

		/* End user-editable values */

		sTimezoneOffset: '',

		GetTimezoneOffset: function()
		{
			var objLocal = new Date();
			objLocal.setHours(0);
			objLocal.setMinutes(0);
			objLocal.setSeconds(0);
			objLocal.setMilliseconds(0);

			var objUTC = new Date();
			objUTC.setMilliseconds(objLocal.getUTCMilliseconds());
			objUTC.setSeconds(objLocal.getUTCSeconds());
			objUTC.setMinutes(objLocal.getUTCMinutes());
			objUTC.setHours(objLocal.getUTCHours());
			objUTC.setDate(objLocal.getUTCDate());
			objUTC.setMonth(objLocal.getUTCMonth());
			objUTC.setFullYear(objLocal.getUTCFullYear());

			this.sTimezoneOffset = ((objLocal.getTime() - objUTC.getTime()) / (1000 * 3600));
			var bNegative = (this.sTimezoneOffset < 0);

			this.sTimezoneOffset  = bNegative ? (this.sTimezoneOffset + '').substring(1) : this.sTimezoneOffset + '';
			this.sTimezoneOffset  = this.sTimezoneOffset.replace(/\.5/, (parseInt('$1', 10) * 60) + '');
			this.sTimezoneOffset += (this.sTimezoneOffset.substring(this.sTimezoneOffset.length - 3) != ':30') ? ':00' : '';
			this.sTimezoneOffset  = (this.sTimezoneOffset.substr(0, this.sTimezoneOffset.indexOf(':')).length == 1) ? '0' + this.sTimezoneOffset : this.sTimezoneOffset;
			this.sTimezoneOffset  = bNegative ? '-' + this.sTimezoneOffset : '+' + this.sTimezoneOffset;

			delete objLocal;
			delete objUTC;
			return true;
		},

		PHPDate: function()
		{
			var sFormat = (arguments.length > 0) ? arguments[0] : '';

			var nYear = this.getFullYear();
			var sYear = nYear + '';

			var nMonth = this.getMonth();
			var sMonth = (nMonth + 1) + '';
			var sPaddedMonth = (sMonth.length == 1) ? '0' + sMonth : sMonth;

			var nDate = this.getDate();
			var sDate = nDate + '';
			var sPaddedDate = (sDate.length == 1) ? '0' + sDate : sDate;

			var nDay = this.getDay();
			var sDay = nDay + '';

			var nHours = this.getHours();

			var sHour12 = (nHours % 12) + '';
			if (sHour12 == '0') sHour12 = '12';
			var sPaddedHour12 = (sHour12.length == 1) ? '0' + sHour12 : sHour12;

			var sHour24 = nHours + '';
			var sPaddedHour24 = (sHour24.length == 1) ? '0' + sHour24 : sHour24;

			var sMinutes = this.getMinutes() + '';
			if (sMinutes.length == 1) sMinutes = '0' + sMinutes;

			var sSeconds = this.getMinutes() + '';
			if (sSeconds.length == 1) sSeconds = '0' + sSeconds;

			var sMeridiem = (this.getHours() < 12) ? 'am' : 'pm';

			sFormat = sFormat.replace(/([AacDdFGgHhijLlMmNnrSsUwYy])/g, 'y5-cal-regexp:$1');
			sFormat = sFormat.replace(/y5-cal-regexp:A/g, sMeridiem.toUpperCase());
			sFormat = sFormat.replace(/y5-cal-regexp:a/g, sMeridiem);
			sFormat = sFormat.replace(/y5-cal-regexp:c/g, sYear + '-' + sPaddedMonth + '-' + sPaddedDate + 'T00:00:00' + objPHPDate.sTimezoneOffset);
			sFormat = sFormat.replace(/y5-cal-regexp:D/g, objPHPDate.aShortDay[nDay]);
			sFormat = sFormat.replace(/y5-cal-regexp:d/g, sPaddedDate);
			sFormat = sFormat.replace(/y5-cal-regexp:F/g, objPHPDate.aMonth[nMonth]);
			sFormat = sFormat.replace(/y5-cal-regexp:G/g, sHour24);
			sFormat = sFormat.replace(/y5-cal-regexp:g/g, sHour12);
			sFormat = sFormat.replace(/y5-cal-regexp:H/g, sPaddedHour24);
			sFormat = sFormat.replace(/y5-cal-regexp:h/g, sPaddedHour12);
			sFormat = sFormat.replace(/y5-cal-regexp:i/g, sMinutes);
			sFormat = sFormat.replace(/y5-cal-regexp:j/g, nDate);
			sFormat = sFormat.replace(/y5-cal-regexp:L/g, objPHPDate.aLetterDay[nDay]);
			sFormat = sFormat.replace(/y5-cal-regexp:l/g, objPHPDate.aDay[nDay]);
			sFormat = sFormat.replace(/y5-cal-regexp:M/g, objPHPDate.aShortMonth[nMonth]);
			sFormat = sFormat.replace(/y5-cal-regexp:m/g, sPaddedMonth);
			sFormat = sFormat.replace(/y5-cal-regexp:N/g, (nDay == 0) ? 7 : nDay);
			sFormat = sFormat.replace(/y5-cal-regexp:n/g, sMonth);
			sFormat = sFormat.replace(/y5-cal-regexp:r/g, objPHPDate.aShortDay[nDay] + ', ' + sPaddedDate + ' ' + objPHPDate.aShortMonth[nMonth] + ' ' + sYear + ' 00:00:00 ' + objPHPDate.sTimezoneOffset.replace(/:/, ''));
			sFormat = sFormat.replace(/y5-cal-regexp:S/g, objPHPDate.aSuffix[nDate]);
			sFormat = sFormat.replace(/y5-cal-regexp:s/g, sSeconds);
			sFormat = sFormat.replace(/y5-cal-regexp:U/g, parseInt((this.getTime() / 1000), 10));
			sFormat = sFormat.replace(/y5-cal-regexp:w/g, nDay);
			sFormat = sFormat.replace(/y5-cal-regexp:Y/g, sYear);
			sFormat = sFormat.replace(/y5-cal-regexp:y/g, sYear.substring(2));

			return sFormat;
		}
	};

	objPHPDate.GetTimezoneOffset();
	Date.prototype.getPHPDate = objPHPDate.PHPDate;
}

if (!window.DateChooser)
{
	window.DateChooser = function()
	{
		/* These values are defaults. Please feel free to modify them as needed. */

		var nWeekStartDay = 0;
		var nXOffset = 0;
		var nYOffset = 0;
		var nTimeout = 0;
		var objAllowedDays = {'0':true, '1':true, '2':true, '3':true, '4':true, '5':true, '6':true};
		var fnUpdate = null;
		var sDefaultIcon = false;
		var objUpdateFields = {};
		var objEarliestDate = null;
		var objLatestDate = null;

		/* End user-editable values */

		if (!arguments || !document.getElementById || !document.getElementsByTagName) return null;
		var ndBodyElement = document.getElementsByTagName('body').length ? document.getElementsByTagName('body')[0] : document;
		var objTimeout = null;
		var ndFrame = null;

		/*@cc_on@*/
		/*@if(@_jscript_version < 6)
			if (document.getElementById('iframehack'))
			{
				ndFrame = document.getElementById('iframehack');
			}
			else
			{
				ndFrame = xb.createElement('iframe');
				ndFrame.id = 'iframehack';
				ndFrame.src = 'javascript:null;';
				ndFrame.scrolling = 'no';
				ndFrame.frameBorder = 0;
				ndFrame.style.border = '0';
				ndFrame.style.padding = 0;
				ndFrame.style.display = 'none';
				ndFrame.style.position = 'absolute';
				ndFrame.style.zIndex = '5000';

				ndBodyElement.appendChild(ndFrame);
			}
		/*@end@*/

		var nDateChooserID = 0;
		while (document.getElementById('calendar' + nDateChooserID)) ++nDateChooserID;
		var sDateChooserID = 'calendar' + nDateChooserID;

		var objSelectedDate = null;

		var objStartDate = new Date();
		objStartDate.setHours(12);
		objStartDate.setMinutes(0);
		objStartDate.setSeconds(0);
		objStartDate.setMilliseconds(0);

		var objMonthYear = new Date(objStartDate);
		objMonthYear.setDate(1);

		var ndDateChooser = xb.createElement('div');
		ndDateChooser.id = sDateChooserID;
		ndDateChooser.className = 'calendar';
		ndDateChooser.style.visibility = 'hidden';
		ndDateChooser.style.position = 'absolute';
		ndDateChooser.style.zIndex = '5001';
		ndDateChooser.style.top = '0';
		ndDateChooser.style.left = '0';
		ndBodyElement.appendChild(ndDateChooser);

		var AddClickEvents = function()
		{
			var aNavLinks = ndDateChooser.getElementsByTagName('thead')[0].getElementsByTagName('a');
			for (var nNavLink = 0; aNavLinks[nNavLink]; ++nNavLink)
			{
				events.add(aNavLinks[nNavLink], 'click', function(e)
				{
					e = e || events.fix(event);
					var ndClicked = e.target || e.srcElement;
					if (ndClicked.nodeName == '#text') ndClicked = ndClicked.parentNode;

					var sClass = ndClicked.className;

					if (sClass == 'previousyear')
					{
						objMonthYear.setFullYear(objMonthYear.getFullYear() - 1);
						if (objEarliestDate && objEarliestDate.getTime() > objMonthYear.getTime())
						{
							objMonthYear.setMonth(objEarliestDate.getMonth());
							objMonthYear.setFullYear(objEarliestDate.getFullYear());
						}
					}
					else if (sClass == 'previousmonth')
					{
						objMonthYear.setMonth(objMonthYear.getMonth() - 1);
						if (objEarliestDate && objEarliestDate.getTime() > objMonthYear.getTime())
						{
							objMonthYear.setMonth(objEarliestDate.getMonth());
							objMonthYear.setFullYear(objEarliestDate.getFullYear());
						}
					}
					else if (sClass == 'currentdate')
					{
						objMonthYear.setMonth(objStartDate.getMonth());
						objMonthYear.setFullYear(objStartDate.getFullYear());
					}
					else if (sClass == 'nextmonth')
					{
						objMonthYear.setMonth(objMonthYear.getMonth() + 1);
						if (objLatestDate && objLatestDate.getTime() < objMonthYear.getTime())
						{
							objMonthYear.setMonth(objLatestDate.getMonth());
							objMonthYear.setFullYear(objLatestDate.getFullYear());
						}
					}
					else if (sClass == 'nextyear')
					{
						objMonthYear.setFullYear(objMonthYear.getFullYear() + 1);
						if (objLatestDate && objLatestDate.getTime() < objMonthYear.getTime())
						{
							objMonthYear.setMonth(objLatestDate.getMonth());
							objMonthYear.setFullYear(objLatestDate.getFullYear());
						}
					}

					RefreshDisplay();
					return false;
				});
			}

			var aDateLinks = ndDateChooser.getElementsByTagName('tbody')[0].getElementsByTagName('a');
			for (var nDateLink = 0; aDateLinks[nDateLink]; ++nDateLink)
			{
				events.add(aDateLinks[nDateLink], 'click', function(e)
				{
					e = e || events.fix(event);
					var ndClicked = e.target || e.srcElement;
					if (ndClicked.nodeName == '#text') ndClicked = ndClicked.parentNode;

					for (var nLink = 0; aDateLinks[nLink]; ++nLink)
					{
						if (aDateLinks[nLink].className == 'selecteddate') aDateLinks[nLink].removeAttribute('class');
					}

					var objTempDate = new Date(objMonthYear);
					objTempDate.setDate(parseInt(ndClicked.childNodes[0].nodeValue, 10));

					var nTime = objTempDate.getTime();
					var sWeekday = objTempDate.getPHPDate('w');
					delete objTempDate;

					if (objEarliestDate && objEarliestDate.getTime() > nTime) return false;
					if (objLatestDate && objLatestDate.getTime() < nTime) return false;
					if (!objAllowedDays[sWeekday]) return false;

					objMonthYear.setTime(nTime);
					objMonthYear.setDate(1);
					if (!objSelectedDate) objSelectedDate = new Date(nTime);
					objSelectedDate.setTime(nTime);
					ndClicked.className = 'selecteddate';

					if (ndFrame) ndFrame.style.display = 'none';
					ndDateChooser.style.visibility = 'hidden';

					if (objTimeout) clearTimeout(objTimeout);

					UpdateFields();

					if (fnUpdate) fnUpdate(objSelectedDate);
					return false;
				});
			}

			return true;
		};

		var UpdateFields = function()
		{
			if (!objSelectedDate) return true;

			for (var sFieldName in objUpdateFields)
			{
				var ndField = document.getElementById(sFieldName);
				if (ndField){
					ndField.value = objSelectedDate.getPHPDate(objUpdateFields[sFieldName]);
					alert(sFieldName + " is " + objSelectedDate.getPHPDate(objUpdateFields[sFieldName]))
				}
			}
			/*
				Code Writen By Piku in updatefeilds
			*
			
			GetValueFromHiddenPutitIntoActualInput();;
			
			/*
				Code Ended By Piku in updatefeilds
			*/
			
			return true;
		};

		var RefreshDisplay = function()
		{
			var ndTable, ndTHead, ndTR, ndTH, ndA, ndTBody, ndTD, nTime, sWeekday;
			var sClass = '';

			var objTempDate = new Date(objMonthYear);

			var objToday = new Date();
			objToday.setHours(12);
			objToday.setMinutes(0);
			objToday.setSeconds(0);
			objToday.setMilliseconds(0);

			ndTable = xb.createElement('table');
			ndTable.setAttribute('summary', 'DateChooser');

			ndTHead = xb.createElement('thead');
			ndTable.appendChild(ndTHead);

			ndTR = xb.createElement('tr');
			ndTR.className = 'dclinks';
			ndTHead.appendChild(ndTR);

			ndTH = xb.createElement('td');
			ndTR.appendChild(ndTH);
			ndA = xb.createElement('a');
			ndA.className = 'previousyear';
			ndA.setAttribute('href', '#');
			ndA.setAttribute('title', 'Previous Year');
			ndTH.appendChild(ndA);
			ndA.appendChild(document.createTextNode(String.fromCharCode(171)));

			ndTH = xb.createElement('td');
			ndTR.appendChild(ndTH);
			ndA = xb.createElement('a');
			ndA.className = 'previousmonth';
			ndA.setAttribute('href', '#');
			ndA.setAttribute('title', 'Previous Month');
			ndTH.appendChild(ndA);
			ndA.appendChild(document.createTextNode(String.fromCharCode(60)));

			ndTH = xb.createElement('td');
			ndTH.setAttribute('colspan', '3');
			/*@cc_on@*/
			/*@if(@_jscript)
				ndTH.colSpan = '3';
			/*@end@*/
			ndTR.appendChild(ndTH);
			ndA = xb.createElement('a');
			ndA.className = 'currentdate';
			ndA.setAttribute('href', '#');
			ndA.setAttribute('title', 'Current Date');
			ndTH.appendChild(ndA);
			ndA.appendChild(document.createTextNode(objMonthYear.getPHPDate("M Y")));

			ndTH = xb.createElement('td');
			ndTR.appendChild(ndTH);
			ndA = xb.createElement('a');
			ndA.className = 'nextmonth';
			ndA.setAttribute('href', '#');
			ndA.setAttribute('title', 'Next Month');
			ndTH.appendChild(ndA);
			ndA.appendChild(document.createTextNode(String.fromCharCode(62)));

			ndTH = xb.createElement('td');
			ndTR.appendChild(ndTH);
			ndA = xb.createElement('a');
			ndA.className = 'nextyear';
			ndA.setAttribute('href', '#');
			ndA.setAttribute('title', 'Next Year');
			ndTH.appendChild(ndA);
			ndA.appendChild(document.createTextNode(String.fromCharCode(187)));

			ndTR = xb.createElement('tr');
			ndTHead.appendChild(ndTR);

			for (var nDay = 0; objPHPDate.aLetterDay[nDay]; ++nDay)
			{
				ndTD = xb.createElement('td');
				ndTR.appendChild(ndTD);
				ndTD.appendChild(document.createTextNode(objPHPDate.aLetterDay[(nWeekStartDay + nDay) % objPHPDate.aLetterDay.length]));
			}

			ndTBody = xb.createElement('tbody');
			ndTable.appendChild(ndTBody);

			while (objTempDate.getMonth() == objMonthYear.getMonth())
			{
				ndTR = xb.createElement('tr');
				ndTBody.appendChild(ndTR);

				for (nDay = 0; nDay < 7; ++nDay)
				{
					var nWeek = (nWeekStartDay + nDay) % objPHPDate.aLetterDay.length;
					if ((objTempDate.getUTCDay() == nWeek) && (objTempDate.getMonth() == objMonthYear.getMonth()))
					{
						nTime = objTempDate.getTime();
						sWeekday = objTempDate.getPHPDate('w');

						sClass  = (objSelectedDate && (objTempDate.getTime() == objSelectedDate.getTime())) ? 'selectedday' : '';
						sClass += (objTempDate.getTime() == objToday.getTime()) ? ' today' : '';
						sClass  = ((sClass.length > 0) && (sClass[1] == ' ')) ? sClass.substr(1, sClass.length - 1) : sClass;

						ndTD = xb.createElement('td');
						if ((objEarliestDate && objEarliestDate.getTime() > nTime) || (objLatestDate && objLatestDate.getTime() < nTime) || !objAllowedDays[sWeekday]) ndTD.className = 'invalidday';
						ndTR.appendChild(ndTD);

						ndA = xb.createElement('a');
						if (sClass.length > 0) ndA.className = sClass;
						ndA.setAttribute('href', '#');
						ndTD.appendChild(ndA);
						ndA.appendChild(document.createTextNode(objTempDate.getDate()));

						objTempDate.setDate(objTempDate.getDate() + 1);
					}
					else
					{
						ndTD = xb.createElement('td');
						ndTR.appendChild(ndTD);
					}
				}
			}

			while (ndDateChooser.hasChildNodes()) ndDateChooser.removeChild(ndDateChooser.firstChild);
			ndDateChooser.appendChild(ndTable);

			if (ndFrame)
			{
				ndFrame.style.display = 'block';
				ndFrame.style.top = ndDateChooser.style.top;
				ndFrame.style.left = ndDateChooser.style.left;
				ndFrame.style.width = (ndTable.clientWidth + 2) + 'px';
				ndFrame.style.height = (ndTable.clientHeight + 4) + 'px';
			}

			AddClickEvents();

			delete objTempDate;
			delete objToday;
			return true;
		};

		var DisplayDateChooser = function()
		{
			var sPositionX = (arguments.length > 0) ? arguments[0] : 'auto';
			var sPositionY = (arguments.length > 1) ? arguments[1] : 'auto';

			var ndStyle = ndDateChooser.style;
			ndStyle.top = sPositionY + '';
			ndStyle.left = sPositionX + '';

			ndDateChooser.style.visibility = 'visible';
			if (objTimeout) clearTimeout(objTimeout);

			if (objSelectedDate)
			{
				objMonthYear.setTime(objSelectedDate.getTime());
			}
			else
			{
				objMonthYear.setTime(objStartDate.getTime());
			}

			objMonthYear.setHours(12);
			objMonthYear.setMinutes(0);
			objMonthYear.setSeconds(0);
			objMonthYear.setMilliseconds(0);
			objMonthYear.setDate(1);

			return RefreshDisplay();
		};

		var GetPosition = function(ndNode)
		{
			var nTop = 0, nLeft = 0;
			if (ndNode.offsetParent)
			{
				nTop = ndNode.offsetTop;
				nLeft = ndNode.offsetLeft;

				while (ndNode.offsetParent)
				{
					ndNode = ndNode.offsetParent;

					nTop += ndNode.offsetTop;
					nLeft += ndNode.offsetLeft;
				}
			}

			return ({'top' : nTop, 'left' : nLeft});
		};

		this.displayPosition = function()
		{
			var sPositionX = (arguments.length > 0) ? arguments[0] : 'auto';
			var sPositionY = (arguments.length > 1) ? arguments[1] : 'auto';

			return DisplayDateChooser(sPositionX, sPositionY);
		};

		this.display = function(e)
		{
			e = e || events.fix(event);

			var ndClicked = e.target || e.srcElement;
			if (ndClicked.nodeName == '#text') ndClicked = ndClicked.parentNode;

			var objPosition = GetPosition(ndClicked);

			DisplayDateChooser(objPosition.left + nXOffset + 'px', objPosition.top + nYOffset + 'px');

			return false;
		};

		this.setXOffset = function()
		{
			nXOffset = ((arguments.length > 0) && (typeof(arguments[0]) == 'number')) ? parseInt(arguments[0], 10) : nXOffset;

			return true;
		};

		this.setYOffset = function()
		{
			nYOffset = ((arguments.length > 0) && (typeof(arguments[0]) == 'number')) ? parseInt(arguments[0], 10) : nYOffset;

			return true;
		};

		this.setCloseTime = function()
		{
			nTimeout = ((arguments.length > 0) && (typeof(arguments[0]) == 'number') && (arguments[0] >= 0)) ? arguments[0] : nTimeout;

			return true;
		};

		this.setUpdateFunction = function()
		{
			if ((arguments.length > 0) && (typeof(arguments[0]) == 'function')) fnUpdate = arguments[0];

			return true;
		};

		this.setUpdateField = function()
		{
			objUpdateFields = {};
			if ((typeof(arguments[0]) == 'string') && (typeof(arguments[1]) == 'string') && document.getElementById(arguments[0]))
			{
				objUpdateFields[arguments[0]] = arguments[1];
			}
			else if ((typeof(arguments[0]) == 'object') && (typeof(arguments[1]) == 'object'))
			{
				for (var nField = 0; arguments[0][nField] !== undefined; ++nField)
				{
					if (nField >= arguments[1].length) break;
					objUpdateFields[arguments[0][nField]] = arguments[1][nField];
				}
			}
			else if (typeof(arguments[0]) == 'object')
			{
				objUpdateFields = arguments[0];
			}

			return true;
		};

		this.setLink = function()
		{
			var sLinkText = ((arguments.length > 0) && (typeof(arguments[0]) == 'string')) ? arguments[0] : 'Choose a date';
			var ndNode = ((arguments.length > 1) && (typeof(arguments[1]) == 'string')) ? document.getElementById(arguments[1]) : null;
			var bPlaceRight = ((arguments.length <= 2) || arguments[2]);
			var sTitleText = ((arguments.length > 3) && (typeof(arguments[3]) == 'string')) ? arguments[3] : 'Click to choose a date';

			if (!ndNode) return false;

			var ndAnchor = xb.createElement('a');
			ndAnchor.className = 'calendarlink';
			ndAnchor.href = '#';

			if (sTitleText.length > 0) ndAnchor.setAttribute('title', sTitleText);
			ndAnchor.appendChild(document.createTextNode(sLinkText));

			if (bPlaceRight)
			{
				if (ndNode.nextSibling)
				{
					ndNode.parentNode.insertBefore(ndAnchor, ndNode.nextSibling);
				}
				else
				{
					ndNode.parentNode.appendChild(ndAnchor);
				}
			}
			else
			{
				ndNode.parentNode.insertBefore(ndAnchor, ndNode);
			}

			events.add(ndAnchor, 'click', this.display);

			return true;
		};

		this.setIcon = function()
		{
			var sIconFile = ((arguments.length > 0) && (typeof(arguments[0]) == 'string')) ? arguments[0] : sDefaultIcon;
			var ndNode = ((arguments.length > 1) && (typeof(arguments[1]) == 'string')) ? document.getElementById(arguments[1]) : null;
			var bPlaceRight = ((arguments.length <= 2) || arguments[2]);
			var sTitleText = ((arguments.length > 3) && (typeof(arguments[3]) == 'string')) ? arguments[3] : 'Click to choose a date';

			if (!ndNode || !sIconFile) return false;

			var ndIcon = xb.createElement('img');
			ndIcon.className = 'calendaricon';
			ndIcon.src = sIconFile;
			ndIcon.setAttribute('alt', 'DateChooser Icon ' + (nDateChooserID + 1));
			if (sTitleText.length > 0) ndIcon.setAttribute('title', sTitleText);

			if (bPlaceRight)
			{
				if (ndNode.nextSibling)
				{
					ndNode.parentNode.insertBefore(ndIcon, ndNode.nextSibling);
				}
				else
				{
					ndNode.parentNode.appendChild(ndIcon);
				}
			}
			else
			{
				ndNode.parentNode.insertBefore(ndIcon, ndNode);
			}

			events.add(ndIcon, 'click', this.display);

			return true;
		};

		this.setStartDate = function()
		{
			if (!arguments.length || !(typeof(arguments[0]) == 'object') || !arguments[0].getTime) return false;

			objStartDate.setTime(arguments[0].getTime());
			objStartDate.setHours(12);
			objStartDate.setMinutes(0);
			objStartDate.setSeconds(0);
			objStartDate.setMilliseconds(0);

			if (objEarliestDate && objEarliestDate.getTime() > objStartDate.getTime())
			{
				objStartDate.setTime(objEarliestDate.getTime());
			}
			else if (objLatestDate && objLatestDate.getTime() < objStartDate.getTime())
			{
				objStartDate.setTime(objLatestDate.getTime());
			}

			objMonthYear.setMonth(objStartDate.getMonth());
			objMonthYear.setFullYear(objStartDate.getFullYear());

			if (!objSelectedDate) objSelectedDate = new Date(objStartDate);
			objSelectedDate.setTime(objStartDate);

			return true;
		};

		this.setEarliestDate = function()
		{
			if (!arguments.length || (typeof(arguments[0]) != 'object') || !arguments[0].getTime) return false;

			objEarliestDate = new Date();
			objEarliestDate.setTime(arguments[0].getTime());
			objEarliestDate.setHours(12);
			objEarliestDate.setMinutes(0);
			objEarliestDate.setSeconds(0);
			objEarliestDate.setMilliseconds(0);

			if (objEarliestDate.getTime() > objStartDate.getTime())
			{
				objStartDate.setTime(objEarliestDate.getTime());
				objMonthYear.setMonth(objEarliestDate.getMonth());
				objMonthYear.setFullYear(objEarliestDate.getFullYear());
			}

			if (objSelectedDate && (objEarliestDate.getTime() > objSelectedDate.getTime()))
			{
				objSelectedDate.setTime(objEarliestDate.getTime());
				objMonthYear.setMonth(objEarliestDate.getMonth());
				objMonthYear.setFullYear(objEarliestDate.getFullYear());
			}

			return true;
		};

		this.setLatestDate = function()
		{
			if (!arguments.length || !(typeof(arguments[0]) == 'object') || !arguments[0].getTime) return false;

			objLatestDate = new Date();
			objLatestDate.setTime(arguments[0].getTime());
			objLatestDate.setHours(12);
			objLatestDate.setMinutes(0);
			objLatestDate.setSeconds(0);
			objLatestDate.setMilliseconds(0);

			if (objLatestDate.getTime() < objStartDate.getTime())
			{
				objStartDate.setTime(objLatestDate.getTime());
				objMonthYear.setFullYear(objLatestDate.getFullYear());
				objMonthYear.setMonth(objLatestDate.getMonth());
			}

			if (objSelectedDate && (objLatestDate.getTime() < objSelectedDate.getTime()))
			{
				objSelectedDate.setTime(objLatestDate.getTime());
				objMonthYear.setFullYear(objLatestDate.getFullYear());
				objMonthYear.setMonth(objLatestDate.getMonth());
			}

			return true;
		};

		this.setAllowedDays = function()
		{
			if (!arguments.length || !(typeof(arguments[0]) == 'object')) return false;

			var nCount;
			for (nCount = 0; nCount < 7; ++nCount)
			{
				objAllowedDays[nCount + ''] = false;
			}

			for (nCount = 0; arguments[0][nCount] !== undefined; ++nCount)
			{
				objAllowedDays[arguments[0][nCount] + ''] = true;
			}

			return true;
		};

		this.setWeekStartDay = function()
		{
			if (!arguments.length || !(typeof(arguments[0]) == 'number')) return false;

			var nNewStartDay = parseInt(arguments[0], 10);
			if ((nNewStartDay < 0) || (nNewStartDay > 6)) return false;

			nWeekStartDay = nNewStartDay;

			return true;
		};

		this.getSelectedDate = function()
		{
			return objSelectedDate;
		};

		this.setSelectedDate = function(objDate)
		{
			if (!objSelectedDate) objSelectedDate = new Date(objDate);

			objSelectedDate.setTime(objDate.getTime());
			objSelectedDate.setHours(12);
			objSelectedDate.setMinutes(0);
			objSelectedDate.setSeconds(0);
			objSelectedDate.setMilliseconds(0);

			UpdateFields();

			return true;
		};

		this.updateFields = function()
		{
			return UpdateFields();
		};

		var clickWindow = function(e)
		{
			e = e || events.fix(event);
			var ndTarget = e.target || e.srcElement;
			if (ndTarget.nodeName == '#text') ndTarget = ndTarget.parentNode;

			while (ndTarget && (ndTarget != document))
			{
				if (ndTarget.className == 'calendar') return true;
				ndTarget = ndTarget.parentNode;
			}

			for (var nCount = 0; nCount <= nDateChooserID; ++nCount)
			{
				if (ndFrame) ndFrame.style.display = 'none';
				document.getElementById('calendar' + nCount).style.visibility = 'hidden';
			}

			return true;
		};

		var mouseoverDateChooser = function()
		{
			if (objTimeout) clearTimeout(objTimeout);
			return true;
		};

		var mouseoutDateChooser = function()
		{
			if (nTimeout > 0) objTimeout = setTimeout('document.getElementById("' + sDateChooserID + '").style.visibility = "hidden"; if (document.getElementById("iframehack")) document.getElementById("iframehack").style.display = "none";', nTimeout);

			return true;
		};

		events.add(ndDateChooser, 'mouseover', mouseoverDateChooser);
		events.add(ndDateChooser, 'mouseout', mouseoutDateChooser);
		events.add(document, 'mousedown', clickWindow);

		return true;
	}
}

if (!escape)
{
	escape = function(sString)
	{
		return encodeURIComponent(sString);
	};
}

if (!Array.prototype.indexOf)
{
	Array.prototype.indexOf = function(objFind)
	{
		var nLength = this.length;

		var nOffset = Number(arguments[1]) || 0;
		nOffset = (nOffset < 0) ? Math.ceil(nOffset) : Math.floor(nOffset);
		if (nOffset < 0) nOffset += nLength;

		while (nOffset < nLength)
		{
			if ((nOffset in this) && (this[nOffset] === objFind)) return nOffset;
			++nOffset;
		}

		return -1;
	};
}

if (!Array.prototype.push)
{
	Array.prototype.push = function()
	{
		for (var nCount = 0; nCount < arguments.length; nCount++)
		{
			this[this.length] = arguments[nCount];
		}

		return this.length;
	};
}

if (!window.xb)
{
	window.xb =
	{
		createElement: function(sElement)
		{
			if (document.createElementNS) return document.createElementNS('http://www.w3.org/1999/xhtml', sElement);
			if (document.createElement) return document.createElement(sElement);

			return null;
		},

		getElementsByAttribute: function(ndNode, sAttributeName, sAttributeValue)
		{
			var aReturnElements = [];

			if (!ndNode.all && !ndNode.getElementsByTagName) return aReturnElements;

			var rAttributeValue = RegExp('(^|\\s)' + sAttributeValue + '(\\s|$)');
			var sValue, aElements = ndNode.all || ndNode.getElementsByTagName('*');

			for (var nIndex = 0; aElements[nIndex]; ++nIndex)
			{
				if (!aElements[nIndex].getAttribute) continue;
				sValue = (sAttributeName == 'class') ? aElements[nIndex].className : aElements[nIndex].getAttribute(sAttributeName);
				if ((typeof(sValue) != 'string') || (sValue.length == 0)) continue;

				if (rAttributeValue.test(sValue)) aReturnElements.push(aElements[nIndex]);
			}

			return aReturnElements;
		},

		getStyle: function(ndNode, sStyle)
		{
			if (document.defaultView && document.defaultView.getComputedStyle) return document.defaultView.getComputedStyle(ndNode, '').getPropertyValue(sStyle);

			if (!ndNode.currentStyle) return true;

			var nIndex = sStyle.indexOf('-');
			while (nIndex >= 0)
			{
				sStyle = sStyle.substring(0, nIndex) + sStyle.substring(nIndex + 1, nIndex + 2).toUpperCase() + nIndex.substring(nIndex + 2);
				nIndex = sStyle.indexOf('-');
			}

			return ndNode.currentStyle[sStyle];
		},

		getOption: function(ndNode, sOption)
		{
			var sText = ndNode.getAttribute(sOption);
			if (sText) return sText;

			var sDefault = (arguments.length == 3) ? arguments[2] : false;
			var aMatch = ndNode.className.match(RegExp('(?:^|\\s)' + sOption + '=(?:\\\'|\\\")([^\\\'\\\"]+)(?:\\\'|\\\"|$)'));

			return aMatch ? aMatch[1] : sDefault;
		},

		emptyNode: function(ndNode)
		{
			while (ndNode.childNodes.length) ndNode.removeChild(ndNode.firstChild);

			return true;
		},

		addText: function(ndNode, sText)
		{
			var aText = sText.replace(/^\s+/, '').replace(/\s+$/, '').replace(/[\r\n]+/, "\n").split('\n');
			for (nIndex = 0; aText[nIndex]; ++nIndex)
			{
				if (nIndex) ndNode.appendChild(xb.createElement('br'));
				ndNode.appendChild(document.createTextNode(aText[nIndex]));
			}

			return true;
		},

		writeText: function(ndNode, sText)
		{
			xb.emptyNode(ndNode);
			xb.addText(ndNode, sText);

			return true;
		},

		setSelectionRange: function(ndText, nStart, nEnd)
		{
			if (ndText.setSelectionRange)
			{
				ndText.setSelectionRange(nStart, nEnd);
			}
			else if (document.selection)
			{
				var nDifference = ndText.value.substring(0, nStart).split("\n").length - 1;
				nStart -= nDifference;
				nEnd -= nDifference;

				var objRange = document.selection.createRange();
				objRange.moveToElementText(ndText);
				objRange.collapse(true);
				objRange.moveStart('character', nStart);
				objRange.moveEnd('character', nEnd - nStart);
				objRange.select();
			}

			ndText.focus();

			return true;
		},

		replaceSelectionRange: function(ndText, sReplace)
		{
			if (ndText.setSelectionRange)
			{
				ndText.value = ndText.value.substring(0, ndText.selectionStart) + sReplace + ndText.value.substring(ndText.selectionEnd);
			}
			else if (document.selection)
			{
				var objRange = document.selection.createRange();
				objRange.text = sReplace;
			}

			ndText.focus();

			return true;
		},

		bookmark: function()
		{
			if (window.sidebar)
			{
				window.sidebar.addPanel(document.title, location.href, null);
				return true;
			}

			if (window.opera && window.print)
			{
				var ndBookmark = xb.createElement('a');
				ndBookmark.setAttribute('rel', 'sidebar');
				ndBookmark.setAttribute('href', location.href);
				ndBookmark.setAttribute('title', document.title);
				ndBookmark.click();
				return true;
			}

			if (document.all)
			{
				window.external.AddFavorite(location.href, document.title);
				return true;
			}

			alert('Click Bookmarks->Add Bookmark... to add this page');
			return false;
		}
	};
}

// This is a variation of the addEvent script written by Dean Edwards (dean.edwards.name).
if (!window.events)
{
	window.events =
	{
		nEventID: 1,

		add: function(ndElement, sType, fnHandler)
		{
			if (!fnHandler.$$nEventID) fnHandler.$$nEventID = this.nEventID++;
			if (ndElement.objEvents === undefined) ndElement.objEvents = {};

			var aHandlers = ndElement.objEvents[sType];
			if (!aHandlers)
			{
				aHandlers = ndElement.objEvents[sType] = {};
				if (ndElement['on' + sType]) aHandlers[0] = ndElement['on' + sType];
			}

			aHandlers[fnHandler.$$nEventID] = fnHandler;
			ndElement['on' + sType] = this.handle;

			return true;
		},

		remove: function(ndElement, sType, fnHandler)
		{
			if (ndElement.objEvents && ndElement.objEvents[sType]) delete ndElement.objEvents[sType][fnHandler.$$nEventID];

			return true;
		},

		exists: function(ndElement, sType, fnHandler)
		{
			return (ndElement.objEvents && ndElement.objEvents[sType] && ndElement.objEvents[sType][fnHandler.$$nEventID]);
		},

		handle: function(e)
		{
			e = e || window.events.fix(event);

			var bReturn = true, aHandlers = this.objEvents[e.type];
			for (var nIndex in aHandlers)
			{
				this.$$handle = aHandlers[nIndex];
				if (this.$$handle(e) === false) bReturn = false;
			}

			return bReturn;
		},

		fix: function(e)
		{
			e.preventDefault = this.fix.preventDefault;
			e.stopPropagation = this.fix.stopPropagation;

			return e;
		},

		cancel: function(e)
		{
			e.preventDefault();
			e.stopPropagation();

			return false;
		},

		getposition: function(e)
		{
			e = e || window.events.fix(event);

			return ({'x' : (e.offsetX ? e.offsetX : (e.pageX ? e.pageX - e.target.offsetLeft : 0)), 'y' : (e.offsetY ? e.offsetY : (e.pageY ? e.pageY - e.target.offsetTop : 0))});
		}
	};

	window.events.fix.preventDefault = function()
	{
		this.returnValue = false;

		return true;
	}

	window.events.fix.stopPropagation = function()
	{
		this.cancelBubble = true;

		return true;
	}
}

events.add(window, 'load', function()
{
	var ndDateChooser, ndElement, sLastID, sLinkID, objUpdateField, objDate, aPatternNodes;
	var sDateFormat, sIcon, sText, sXOffset, sYOffset, sCloseTime, sOnUpdate, sStartDate, sEarliestDate, sLatestDate, sAllowedDays, sWeekStartDay, sLinkPosition;
	var nFieldID = 0;

	objDate = new Date();
	objDate.setHours(12);
	objDate.setMinutes(0);
	objDate.setMilliseconds(0);

	var aElements = xb.getElementsByAttribute(document, 'class', 'datechooser');
	for (var nIndex = 0; aElements[nIndex]; ++nIndex)
	{
		ndDateChooser = aElements[nIndex];
		if (!ndDateChooser.id) ndDateChooser.id = 'dc-id-' + (++nFieldID);
		sLastID = ndDateChooser.id;

		sDateFormat = xb.getOption(ndDateChooser, 'dc-dateformat');
		sIcon = xb.getOption(ndDateChooser, 'dc-iconlink');
		sText = xb.getOption(ndDateChooser, 'dc-textlink');
		sXOffset = xb.getOption(ndDateChooser, 'dc-offset-x');
		sYOffset = xb.getOption(ndDateChooser, 'dc-offset-y');
		sCloseTime = xb.getOption(ndDateChooser, 'dc-closetime');
		sOnUpdate = xb.getOption(ndDateChooser, 'dc-onupdate');
		sStartDate = xb.getOption(ndDateChooser, 'dc-startdate');
		sEarliestDate = xb.getOption(ndDateChooser, 'dc-earliestdate');
		sLatestDate = xb.getOption(ndDateChooser, 'dc-latestdate');
		sAllowedDays = xb.getOption(ndDateChooser, 'dc-alloweddays');
		sWeekStartDay = xb.getOption(ndDateChooser, 'dc-weekstartday');
		sLinkPosition = xb.getOption(ndDateChooser, 'dc-linkposition');

		if (sLinkPosition) sLinkID = ndDateChooser.id;

		objUpdateField = {};
		if (sDateFormat) objUpdateField[ndDateChooser.id] = sDateFormat;

		aPatternNodes = ndDateChooser.all || ndDateChooser.getElementsByTagName('*');
		for (var nPattern = 0; aPatternNodes[nPattern]; ++nPattern)
		{
			ndElement = aPatternNodes[nPattern];

			sDateFormat = xb.getOption(ndElement, 'dc-dateformat');
			if (!sDateFormat) continue;

			if (!ndElement.id) ndElement.id = 'dc-id-' + (++nFieldID);

			sLastID = ndElement.id;
			objUpdateField[sLastID] = sDateFormat;

			if (!sLinkPosition) xb.getOption(ndElement, 'dc-linkposition');
			if (sLinkPosition) sLinkID = sLastID;
		}

		if (!sLinkPosition)
		{
			sLinkID = sLastID;
			sLinkPosition = 'right';
		}

		ndDateChooser.DateChooser = new DateChooser();
		if (sXOffset) ndDateChooser.DateChooser.setXOffset(sXOffset);
		if (sYOffset) ndDateChooser.DateChooser.setYOffset(sYOffset);
		if (sCloseTime) ndDateChooser.DateChooser.setCloseTime(sCloseTime);
		if (sOnUpdate) ndDateChooser.DateChooser.setUpdateFunction(eval(sOnUpdate));

		if (sStartDate)
		{
			objDate = new Date();
			objDate.setFullYear(parseInt(sStartDate.substring(4), 10));
			objDate.setMonth(parseInt(sStartDate.substring(0, 2), 10) - 1);
			objDate.setDate(parseInt(sStartDate.substring(2, 4), 10));

			ndDateChooser.DateChooser.setStartDate(objDate);
		}

		if (sEarliestDate)
		{
			objDate = new Date();
			objDate.setFullYear(parseInt(sEarliestDate.substring(4), 10));
			objDate.setMonth(parseInt(sEarliestDate.substring(0, 2), 10) - 1);
			objDate.setDate(parseInt(sEarliestDate.substring(2, 4), 10));

			ndDateChooser.DateChooser.setEarliestDate(objDate);
		}

		if (sLatestDate)
		{
			objDate = new Date();
			objDate.setFullYear(parseInt(sLatestDate.substring(4), 10));
			objDate.setMonth(parseInt(sLatestDate.substring(0, 2), 10) - 1);
			objDate.setDate(parseInt(sLatestDate.substring(2, 4), 10));

			ndDateChooser.DateChooser.setLatestDate(objDate);
		}

		if (sAllowedDays) ndDateChooser.DateChooser.setAllowedDays(sAllowedDays.split(','));
		if (sWeekStartDay) ndDateChooser.DateChooser.setWeekStartDay(parseInt(sWeekStartDay, 10));
		if (sIcon) ndDateChooser.DateChooser.setIcon(sIcon, sLinkID, (sLinkPosition != 'left'));
		if (sText) ndDateChooser.DateChooser.setLink(sText, sLinkID, (sLinkPosition != 'left'));
		ndDateChooser.DateChooser.setUpdateField(objUpdateField);
	}

	delete objDate;

	return true;
});